/* Modelagem do Problema 01a */

/* Written in GNU MathProg by Raniere Silva <r.gaia.cs@gmai.com> */

param y, integer, > 0;
/* numero de tarefas */

param x, integer, > 0;
/* numero de semanas */

set J := 1..y;
/* conjunto de tarefas */

set S := 1..x;
/* conjunto de semanas */

param l{j in J};
/* duracao da tarefa j */

param q{i in S};
/* mao-de-obra disponivel na semana i */

param k, integer, >0;
/* maximo de semanas da duracao das tarefas */

param m{j in J, i in {1..k}};
/* mao-de-obra da tarefa j na i-esima semana de sua execucao */

var p{j in J, i in S}, binary;
/* 1 se a tarefa j inicia na semana i, 0 caso contrario */

s.t. comeco{j in J}:
        sum{i in {1..x-l[j]+1}} p[j,i] >= 1;
/* a tarefa j comeca de tal modo que ate na semana m ela tenha terminado */

s.t. uni{j in J}:
        sum{i in S} p[j,i] = 1;
/* a tarefa j eh executada uma unica vez */

s.t. dis{i in S}:
        sum{j in J, a in {1..min(i,l[j])}}m[j,a]*p[j,i-a+1] <= q[i];
/* mao-de-obra utilizada deve ser menor ou igual a mao-de-obra disponivel */

minimize obj: 1;
/* funcao objetivo */

end;
